<?php

namespace app\api\v1\controller;

use think\Controller;
use think\Request;
use think\Config;
use Qcloud\Cos\Client;
use OSS\OssClient;
use OSS\Core\OssException;
use Qiniu\Storage\UploadManager;
use Qiniu\Auth;

class Upload extends Controller
{
    /**
     * 腾讯cos对象存储
     * @param Request $request
     * @return \think\response\Json
     */
    public function tx(Request $request)
    {
        //获取文件名
        foreach ($_FILES as $key => $value) {
            $file_key = $key;
        }
        //获取文件信息
        $file = $request->file($file_key);
        //获取文件的url和文件
        $yun = json_decode(yunUpload($file, $file_key));
        //文件生成的url
        $file_url = $yun->file_url;
        //文件路径
        $file_path = $yun->file_path;

        $cosClient = new Client(array(
            'region' => config('cos.region'),
            'credentials'=> array(
                'secretId'    => config('cos.SecretId'),
                'secretKey' => config('cos.SecretKey'),
            )
        ));
        //云文件存储位置
        $bucket = config('cos.bucket');
        //返回图片链接
        $img_url = Config('cos.domain').'/'.$file_url;

        try {
            $cosClient->Upload(
                $bucket,
                $file_url,
                fopen($file_path, 'rb')
            );
            return show(config('code.success'), '上传成功', $img_url, 200);
        } catch (\Exception $e) {
            return show(config('code.error'), $e->getMessage(), [], 400);
        }
    }


    /**
     * 阿里云oss公共读写上传文件
     * @param Request $request
     * @return string|\think\response\Json
     */
    public function al(Request $request)
    {
        foreach ($_FILES as $key => $value) {
            $file_key = $key;
        }
        //获取文件信息
        $file = $request->file($file_key);
        //获取文件的url和文件
        $yun = json_decode(yunUpload($file, $file_key));
        //文件生成的url
        $file_url = $yun->file_url;
        //文件路径
        $file_path = $yun->file_path;

        try {
            $ossClient = new OssClient(Config::get('aliyun.OssKeyID'), Config::get('aliyun.OssKeySecret'),
                Config::get('aliyun.Ossendpoint'));
            $retu_img  = $ossClient->uploadFile(Config::get('aliyun.Ossbucket'), $file_url, $file_path);
            if ($retu_img) {
                $url = $retu_img['info']['url'];
                return show(config('code.success'), '上传成功！', $url, 200);
            }
        } catch (OssException $e) {
            return show(config('code.error'), $e->getMessage(), [], 500);
        }
    }

    /**
     * 七牛云对象存储
     * @param Request $request
     * @return \think\response\Json
     */
    public function qn(Request $request)
    {
        foreach ($_FILES as $key => $value) {
            $file_key = $key;
        }
        //获取文件信息
        $file = $request->file($file_key);
        //获取文件的url和文件
        $yun = json_decode(yunUpload($file, $file_key));
        //文件生成的url
        $file_url = $yun->file_url;
        //文件路径
        $file_path = $yun->file_path;
        // 初始化签权对象
        $auth = new Auth(Config::get('qiniu.qnAK'), Config::get('qiniu.qnSK'));

        $token = $auth->uploadToken(Config('qiniu.buket'));

        try {
            //初始UploadManager类
            $uploadMgr = new UploadManager();
            list($ret, $err) = $uploadMgr->putFile($token, $file_url, $file_path);
            if ($err !== null) {
                return show(config('code.error'), '文件上传接口暂不可用', [], 400);
            } else {
                return show(config('code.success'), '上传成功！', Config('qiniu.domian').'/'.$ret['key'], 200);
            }
        } catch (\Exception $e) {
            return show(config('code.error'), $e->getMessage(), [], 500);
        };
    }

    /**
     * 本地文件上传
     * @param Request $request
     * @return \think\response\Json
     */
    public function localUpload(Request $request){
        foreach($_FILES as $key => $value){
            $file_key = $key;
        }
        // 获取表单上传文件 例如上传了001.jpg
        $file = $request->file($file_key);
        //验证文件是否存在
        if(empty($file)){
            return show(config('code.error'), '文件不存在', [], 400);
        }
        // 移动到框架应用根目录/public/uploads/ 目录下
        $info = $file->validate(['size'=>15678000,'ext'=>'jpg,png,jpeg,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads');
        if($info){
            //获取文件完整链接
            $domain = $request->domain(). DS . 'uploads'.'/'.$info->getSaveName();
            //替换转移字符
            $file_url = str_replace("\\", "/", $domain);

            return show(config('code.success'), "上传成功！", $file_url, 200);
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }
    }


}